package cn.kingshion.reflectiong;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 使用Class 反射新建对象
 */
public class Test07 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        // 获得 Class 对象
        Class c1 = Class.forName("cn.kingshion.reflectiong.User");

        // 构造一个对象
//        User user = (User) c1.newInstance();
//        System.out.println("user:" + user);

        // 通过构造器创建对象
//        Constructor<?> constructor = c1.getConstructor(String.class, int.class, int.class);
//        User jjx = (User) constructor.newInstance("jjx", 10, 20);
//        System.out.println("jjx:" + jjx);

        // 通过反射调用普通方法
        System.out.println("通过反射调用普通方法==================");
        User user1 = (User) c1.newInstance();
        Method setName = c1.getDeclaredMethod("setName", String.class);
        // invoke ：反向激活
        setName.invoke(user1, "kingshion");
        System.out.println(user1.getName());

        // 通过反射操作属性
        System.out.println("通过反射操作属性=================");
        User user2 = (User) c1.newInstance();
        Field name = c1.getDeclaredField("name");
        name.setAccessible(true);   // 设置可以访问，尽管这个属性是private 修饰的
        name.set(user2, "kingshion——jjx");
        System.out.println(user2.getName());
        // 此时报错，因为 User 类的 属性都是 private 修饰的
        /*
         Exception in thread "main" java.lang.IllegalAccessException: Class cn.kingshion.reflectiong.Test07 can not access a member of class cn.kingshion.reflectiong.User with modifiers "private"
	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)

	结论；不能直接操作私有属性，我们需要关闭安全监测，属性或者方法 的 setAccessible（true）;
         */
        /*
        解决方案：
            设置可访问： name.setAccessible(true);
         */


    }
}
